package com.xm.xmwa1706090.service.util;

import java.util.Arrays;

/**
 * @author Loysen
 * @company 杭州新苗网络科技有限公司
 * @date 2017/6/19  13:51
 * @
 */
public class HexCodeUtils {

    /**
     * 字符串转换成十六进制字符串
     * @param   str 待转换的ASCII字符串
     * @return String 每个Byte之间空格分隔，如: [61 6C 6B]
     */
    public static String str2HexStr(String str)
    {

        char[] chars = "0123456789ABCDEF".toCharArray();
        StringBuilder sb = new StringBuilder("");
        byte[] bs = str.getBytes();
        int bit;

        for (int i = 0; i < bs.length; i++)
        {
            bit = (bs[i] & 0x0f0) >> 4;
            sb.append(chars[bit]);
            bit = bs[i] & 0x0f;
            sb.append(chars[bit]);
            //sb.append(' ');
        }
        return sb.toString().trim();
    }

    /**
     * 十六进制转换字符串
     * @param   hexStr Byte字符串(Byte之间无分隔符 如:[616C6B])
     * @return String 对应的字符串
     */
    public static String hexStr2Str(String hexStr)
    {
        String str = "0123456789ABCDEF";
        char[] hexs = hexStr.toCharArray();
        byte[] bytes = new byte[hexStr.length() / 2];
        int n;

        for (int i = 0; i < bytes.length; i++)
        {
            n = str.indexOf(hexs[2 * i]) * 16;
            n += str.indexOf(hexs[2 * i + 1]);
            bytes[i] = (byte) (n & 0xff);
        }
        return new String(bytes);
    }

    /**
     * bytes转换成十六进制字符串
     * @param   b byte数组
     * @return String 每个Byte值之间空格分隔
     */
    public static String byte2HexStr(byte[] b)
    {
        String stmp="";
        StringBuilder sb = new StringBuilder("");
        for (int n=0;n<b.length;n++)
        {
            stmp = Integer.toHexString(b[n] & 0xFF);
            sb.append((stmp.length()==1)? "0"+stmp : stmp);
            sb.append(" ");
        }
        return sb.toString().toUpperCase().trim();
    }

    /**
     * bytes字符串转换为Byte值
     * @param   src Byte字符串，每个Byte之间没有分隔符
     * @return byte[]
     */
    public static byte[] hexStr2Bytes(String src)
    {
        int m=0,n=0;
        int l=src.length()/2;
        System.out.println(l);
        byte[] ret = new byte[l];
        for (int i = 0; i < l; i++)
        {
            m=i*2+1;
            n=m+1;
            ret[i] = Byte.decode("0x" + src.substring(i*2, m) + src.substring(m,n));
        }
        return ret;
    }

    /**
     * String的字符串转换成unicode的String
     * @param   strText 全角字符串
     * @return String 每个unicode之间无分隔符
     * @throws Exception
     */
    public static String strToUnicode(String strText)
            throws Exception
    {
        char c;
        StringBuilder str = new StringBuilder();
        int intAsc;
        String strHex;
        for (int i = 0; i < strText.length(); i++)
        {
            c = strText.charAt(i);
            intAsc = (int) c;
            strHex = Integer.toHexString(intAsc);
            if (intAsc > 128)
                str.append("\\u" + strHex);
            else // 低位在前面补00
                str.append("\\u00" + strHex);
        }
        return str.toString();
    }

    /**
     * unicode的String转换成String的字符串
     * @param   hex 16进制值字符串 （一个unicode为2byte）
     * @return String 全角字符串
     */
    public static String unicodeToString(String hex)
    {
        int t = hex.length() / 6;
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < t; i++)
        {
            String s = hex.substring(i * 6, (i + 1) * 6);
            // 高位需要补上00再转
            String s1 = s.substring(2, 4) + "00";
            // 低位直接转
            String s2 = s.substring(4);
            // 将16进制的string转为int
            int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16);
            // 将int转换为字符
            char[] chars = Character.toChars(n);
            str.append(new String(chars));
        }
        return str.toString();
    }




    /**
     * 右补位，左对齐
     * @param oriStr  原字符串
     * @param len  目标字符串长度
     * @param alexin  补位字符
     * @return  目标字符串
     */
    public static String padRight(String oriStr,int len,char alexin){
        String str ="";
        int strlen = oriStr.length();
        if(strlen < len){
            for(int i=0;i<len-strlen;i++){
                str = str+alexin;
            }
        }
        str = str + oriStr;
        return str;
    }

    /**
     * 10进制转16进制，左补位 如 132 -> 0x0084
     * 左补位，右对齐
     * @param oriInt  原10进制数字
     * @param len  目标字符串长度
     * @return  目标字符串
     */
    public static String tenToHexPadLeft(int oriInt,int len){
        String s = Integer.toHexString(oriInt);
        byte[] bs = new byte[len];
        byte[] ss = s.getBytes();
        Arrays.fill(bs, (byte) (48 & 0xff));
        System.arraycopy(ss, 0, bs,len - ss.length, ss.length);
        return new String(bs);
    }



    public static void main(String[] args) {
       int youNumber = 1;
        // 0 代表前面补充0
        // 4 代表长度为4
        // d 代表参数为正数型
      //  String str = String.format("%0"+2+"d", 84);
     //   Integer intHao = Integer.parseInt("F");
        String  str =  HexCodeUtils.tenToHexPadLeft(132,4);
        System.out.println(str); //*//*  0001*/

  /*      int a = 0x1234;
        byte low = (byte)(a & 0xff);
        byte hig = (byte)(a>>8);
        System.out.println("高8位是："+hig+", 低8位是："+low);*/
       /* int n1 = 14;
        //十进制转成十六进制：
        System.out.println( Integer.toHexString(n1) );
        //十进制转成二进制
        System.out.println(  Integer.toBinaryString(12) );
        //十六进制转成十进制
        System.out.println( Integer.valueOf("FFFF",16).toString() );
        //十六进制转成二进制
        System.out.println( Integer.toBinaryString(Integer.valueOf("FFFF",16)) );
        //二进制转十进制
        System.out.println( Integer.valueOf("0101",2).toString() );
        //二进制转十六进制
        Integer.toHexString(Integer.parseInt("0101", 2));*/

    }


}
